#ifndef __BACKUP_FILES_UPLOADER_H__
#define __BACKUP_FILES_UPLOADER_H__

#include <string>
#include <boost/filesystem.hpp>

#include "LogWriter.h"
#include "UdpIpList.h"


/**
 * Service de surveillance d'un dossier, envoyant tout fichier cree dans celui-ci
 * vers une autre machine devant le garder comme sauvegarde.
 *
 * @author Benoit FLEURY
 */
class BackupFilesUploader
{
public:

	BackupFilesUploader(const LogWriter& logWriter);

	/** Definir les attributs de cet objet. */
	void set_monitored_directory(const std::string& monitoredDirPathStr);
	void set_destination_servers(const UdpIpList& destServerIps);

	/** Lancer la surveillance du dossier. */
	void run();

private:
	
	/** Ecriveur de log. */
	const LogWriter& m_logWriter;
	/** Service d'entre-sortie pour la socket envoyant les fragments de fichier. */
	boost::asio::io_service m_ioService;
	/** Chemin vers le dossier a surveiller. */
	boost::filesystem::path m_monitoredDirPath;
	/** Liste des adresses IP UDP des serveurs de sauvegarde. */
	UdpIpList m_destServerIps;

	/**
	 * Envoyer le fichier donne vers le serveur donne.
	 *
	 * @param filePath Chemin vers le fichier a envoyer.
	 * @param serverEndpoint Serveur auquel envoyer le fichier.
	 */
	void upload_file_to_one(const boost::filesystem::path& filePath,
		const boost::asio::ip::udp::endpoint& serverEndpoint);
	/**
	 * Envoyer le fichier donne vers un certain nombre de serveurs de la liste, choisis
	 * en fonction du numero du patient.
	 *
	 * @param filePath Chemin vers le fichier a envoyer.
	 */
	void backup_file(const boost::filesystem::path& filePath);
};


#endif // __BACKUP_FILES_UPLOADER_H__
